/*
 * Copyright Codeplay Software Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use these files except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// DO NOT MODIFY BY HAND
// This file was automatically generated by generate_pooling_tests.py.
// Results calculated using Tensorflow v1.12.0.

#include <gtest/gtest.h>

#include "sycldnn/padding_mode.h"

#include "sycldnn/pooling/operators.h"

#include "test/types/cartesian_product.h"
#include "test/types/kernel_data_types.h"
#include "test/types/test_backend_types.h"
#include "test/types/to_gtest_types.h"

#include "test/pooling/pooling_fixture.h"

#include <array>
#include <vector>

using namespace sycldnn;  // NOLINT(google-build-using-namespace)
using DataTypeList = sycldnn::types::KernelDataTypes;
using Backends = sycldnn::types::DefaultBackendTypes;

using SNNTypePairs =
    sycldnn::types::CartesianProduct<DataTypeList, Backends>::type;
using GTestTypePairs = sycldnn::types::ToGTestTypes<SNNTypePairs>::type;

template <typename Pair>
using MaxwithnanWindow3Stride2Grad =
    PoolingFixture<typename Pair::FirstType, typename Pair::SecondType,
                   pooling::MaxWithNan, pooling::Backpropagate>;
TYPED_TEST_SUITE(MaxwithnanWindow3Stride2Grad, GTestTypePairs);
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x5x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {0., 0., 0., 0., 0., 0., 1., 0., 2.,
                                         3., 0., 0., 0., 0., 0., 0., 4., 0.,
                                         5., 6., 0., 7., 0., 8., 9.};
  const std::array<int, 4> in_shape = {{1, 5, 5, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x5x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {0., 0., 0., 0., 0., 0., 0., 0., 0.,
                                         0., 0., 0., 1., 0., 2., 0., 0., 0.,
                                         0., 0., 0., 0., 3., 0., 4.};
  const std::array<int, 4> in_shape = {{1, 5, 5, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x5x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0., 0.,  1.,
      2.,  0., 0., 3.,  4.,  5., 6., 0.,  0.,  0.,  0., 0.,  0.,
      0.,  0., 0., 0.,  0.,  0., 7., 8.,  0.,  0.,  9., 10., 11.,
      12., 0., 0., 13., 14., 0., 0., 15., 16., 17., 18.};
  const std::array<int, 4> in_shape = {{1, 5, 5, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x5x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 1., 2., 0., 0., 3., 4., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5., 6., 0., 0., 7., 8.};
  const std::array<int, 4> in_shape = {{1, 5, 5, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x5x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  0.,  0.,
      0.,  0.,  5.,  6.,  7.,  8.,  9.,  10., 11., 12., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  13., 14., 15., 16., 0.,  0.,  0.,  0.,  17., 18., 19.,
      20., 21., 22., 23., 24., 0.,  0.,  0.,  0.,  25., 26., 27., 28., 0.,  0.,
      0.,  0.,  29., 30., 31., 32., 33., 34., 35., 36.};
  const std::array<int, 4> in_shape = {{1, 5, 5, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x5x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  1., 2., 3.,
      4., 0., 0., 0., 0.,  5.,  6.,  7., 8., 0., 0., 0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0., 9., 10., 11., 12., 0., 0., 0., 0., 13., 14., 15., 16.};
  const std::array<int, 4> in_shape = {{1, 5, 5, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x5x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 2., 3., 0., 0., 0.,
      0., 0., 0., 0., 0., 4., 0., 5., 6., 0., 0., 7., 0., 8., 9.};
  const std::array<int, 4> in_shape = {{1, 5, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x5x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.,
      0., 2., 0., 0., 0., 0., 0., 0., 0., 0., 0., 3., 0., 4., 0.};
  const std::array<int, 4> in_shape = {{1, 5, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x5x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0.,  1.,  2.,  0., 0., 3., 4., 5.,  6.,  0., 0., 0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 7., 8.,  0.,  0.,  9.,
      10., 11., 12., 0., 0., 0., 0., 13., 14., 0., 0., 15., 16., 17., 18.};
  const std::array<int, 4> in_shape = {{1, 5, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x5x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2.,
      0., 0., 3., 4., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 5., 6., 0., 0., 7., 8., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 5, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x5x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  0.,  0.,  0.,  0.,  5.,  6.,
      7.,  8.,  9.,  10., 11., 12., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  13., 14., 15., 16.,
      0.,  0.,  0.,  0.,  17., 18., 19., 20., 21., 22., 23., 24., 0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  25., 26., 27., 28., 0.,  0.,  0.,  0.,
      29., 30., 31., 32., 33., 34., 35., 36.};
  const std::array<int, 4> in_shape = {{1, 5, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x5x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  1., 2., 3., 4.,
      0.,  0.,  0.,  0., 5., 6., 7., 8.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 9.,
      10., 11., 12., 0., 0., 0., 0., 13., 14., 15., 16., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 5, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x5x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 1.,  0., 2., 0.,
      3., 4., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,  0., 5., 0.,
      6., 0., 7., 8., 0., 0., 9., 0., 10., 0., 11., 12.};
  const std::array<int, 4> in_shape = {{1, 5, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x5x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 1., 0., 2., 0., 3., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 4., 0., 5., 0., 6., 0.};
  const std::array<int, 4> in_shape = {{1, 5, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x5x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0., 5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 9.,  10., 0., 0., 11., 12., 0., 0., 13., 14., 15., 16.,
      0., 0., 0., 0., 17., 18., 0., 0., 19., 20., 0., 0., 21., 22., 23., 24.};
  const std::array<int, 4> in_shape = {{1, 5, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x5x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 1., 2., 0., 0., 3., 4.,  0., 0., 5.,  6.,  0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 7., 8., 0., 0., 9., 10., 0., 0., 11., 12., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 5, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x5x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  0.,
      0.,  0.,  0.,  5.,  6.,  7.,  8.,  0.,  0.,  0.,  0.,  9.,  10., 11., 12.,
      13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  17.,
      18., 19., 20., 0.,  0.,  0.,  0.,  21., 22., 23., 24., 0.,  0.,  0.,  0.,
      25., 26., 27., 28., 29., 30., 31., 32., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  33., 34., 35., 36., 0.,  0.,  0.,  0.,  37., 38., 39., 40., 0.,  0.,
      0.,  0.,  41., 42., 43., 44., 45., 46., 47., 48.};
  const std::array<int, 4> in_shape = {{1, 5, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x5x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0.,
      5.,  6.,  7.,  8.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 13., 14., 15., 16., 0., 0., 0., 0.,
      17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 5, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x6x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 2., 3.,
      0., 0., 0., 0., 0., 0., 4., 0., 5., 6., 0., 7., 0., 8., 9.};
  const std::array<int, 4> in_shape = {{1, 6, 5, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x6x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 2.,
      0., 0., 0., 0., 0., 0., 0., 3., 0., 4., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 6, 5, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x6x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0., 0., 1.,  2.,  0., 0., 3.,  4.,  5.,  6.,
      0., 0., 0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  7.,  8.,  0.,
      0., 9., 10., 11., 12., 0., 0., 13., 14., 0., 0., 15., 16., 17., 18.};
  const std::array<int, 4> in_shape = {{1, 6, 5, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x6x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2., 0., 0., 3., 4.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.,
      6., 0., 0., 7., 8., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 6, 5, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x6x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  1.,  2.,  3.,  4.,  0.,  0.,  0.,  0.,  5.,  6.,  7.,  8.,
      9.,  10., 11., 12., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      13., 14., 15., 16., 0.,  0.,  0.,  0.,  17., 18., 19., 20., 21., 22.,
      23., 24., 0.,  0.,  0.,  0.,  25., 26., 27., 28., 0.,  0.,  0.,  0.,
      29., 30., 31., 32., 33., 34., 35., 36.};
  const std::array<int, 4> in_shape = {{1, 6, 5, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x6x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,
      0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,
      0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,
      0.,  0.,  0., 1., 2., 3., 4.,  0.,  0.,  0.,  0., 5., 6., 7., 8.,
      0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,
      0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 9., 10.,
      11., 12., 0., 0., 0., 0., 13., 14., 15., 16., 0., 0., 0., 0., 0.,
      0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 6, 5, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x6x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 2., 3.,
      0., 0., 0., 0., 0., 0., 0., 0., 4., 0., 5., 6., 0., 0., 7., 0., 8., 9.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x6x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 2., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 3., 0., 4., 0., 0., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x6x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0., 0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0., 0.,  1.,  2.,
      0., 0., 3., 4., 5.,  6.,  0., 0., 0.,  0.,  0.,  0., 0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0., 7., 8.,  0.,  0.,  9., 10., 11., 12.,
      0., 0., 0., 0., 13., 14., 0., 0., 15., 16., 17., 18.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x6x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2., 0., 0., 3., 4., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5., 6.,
      0., 0., 7., 8., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x6x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,
      0.,  0.,  0.,  0.,  5.,  6.,  7.,  8.,  9.,  10., 11., 12., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  13.,
      14., 15., 16., 0.,  0.,  0.,  0.,  17., 18., 19., 20., 21., 22., 23., 24.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  25., 26., 27., 28., 0.,  0.,  0.,
      0.,  29., 30., 31., 32., 33., 34., 35., 36.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x6x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 1., 2.,  3.,  4.,  0., 0., 0., 0.,
      5.,  6.,  7.,  8.,  0., 0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 9., 10., 11., 12., 0., 0., 0., 0.,
      13., 14., 15., 16., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x6x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,  0.,
      0., 0., 1., 0., 2., 0., 3., 4., 0., 0., 0., 0., 0.,  0., 0.,  0.,
      0., 0., 5., 0., 6., 0., 7., 8., 0., 0., 9., 0., 10., 0., 11., 12.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x6x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 1., 0., 2., 0., 3., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 4., 0., 5., 0., 6., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x6x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0., 5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 9.,  10., 0., 0., 11., 12., 0., 0., 13., 14., 15., 16.,
      0., 0., 0., 0., 17., 18., 0., 0., 19., 20., 0., 0., 21., 22., 23., 24.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x6x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 1., 2., 0., 0., 3., 4.,  0., 0., 5.,  6.,  0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 7., 8., 0., 0., 9., 10., 0., 0., 11., 12., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0., 0.,  0.,  0., 0.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x6x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,
      4.,  0.,  0.,  0.,  0.,  5.,  6.,  7.,  8.,  0.,  0.,  0.,  0.,  9.,  10.,
      11., 12., 13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  17., 18., 19., 20., 0.,  0.,  0.,  0.,  21., 22., 23., 24., 0.,  0.,
      0.,  0.,  25., 26., 27., 28., 29., 30., 31., 32., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  33., 34., 35., 36., 0.,  0.,  0.,  0.,  37., 38., 39., 40.,
      0.,  0.,  0.,  0.,  41., 42., 43., 44., 45., 46., 47., 48.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x6x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0.,
      5.,  6.,  7.,  8.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 13., 14., 15., 16., 0., 0., 0., 0.,
      17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x8x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,  1., 0., 2.,
      3., 0., 0., 0., 0., 0., 0., 4., 0.,  5., 6.,  0., 0., 0.,
      0., 0., 0., 7., 0., 8., 9., 0., 10., 0., 11., 12.};
  const std::array<int, 4> in_shape = {{1, 8, 5, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x8x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,
      2., 0., 0., 0., 0., 0., 0., 0., 3., 0., 4., 0., 0., 0.,
      0., 0., 0., 0., 5., 0., 6., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 8, 5, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x8x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0.,  0.,  0.,  1.,  2., 0.,  0.,  3.,  4.,
      5., 6., 0.,  0.,  0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,
      7., 8., 0.,  0.,  9., 10., 11., 12., 0.,  0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0.,  13., 14., 0.,  0., 15., 16., 17., 18.,
      0., 0., 19., 20., 0., 0.,  21., 22., 23., 24.};
  const std::array<int, 4> in_shape = {{1, 8, 5, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x8x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0.,  0., 0., 0.,  0.,  0., 0., 1., 2., 0., 0., 3., 4., 0., 0.,
      0., 0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0., 0., 5., 6., 0., 0.,
      7., 8.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      9., 10., 0., 0., 11., 12., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 8, 5, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x8x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,
      2.,  3.,  4.,  0.,  0.,  0.,  0.,  5.,  6.,  7.,  8.,  9.,  10., 11., 12.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  13., 14., 15., 16., 0.,  0.,
      0.,  0.,  17., 18., 19., 20., 21., 22., 23., 24., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  25., 26., 27., 28., 0.,  0.,  0.,  0.,  29., 30., 31.,
      32., 33., 34., 35., 36., 0.,  0.,  0.,  0.,  37., 38., 39., 40., 0.,  0.,
      0.,  0.,  41., 42., 43., 44., 45., 46., 47., 48.};
  const std::array<int, 4> in_shape = {{1, 8, 5, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x8x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      1.,  2.,  3.,  4.,  0., 0., 0., 0., 5.,  6.,  7.,  8.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      13., 14., 15., 16., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 8, 5, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x8x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 1.,  0.,
      2., 3., 0., 0., 0., 0., 0., 0., 0., 0., 4., 0., 5.,  6., 0.,  0.,
      0., 0., 0., 0., 0., 0., 7., 0., 8., 9., 0., 0., 10., 0., 11., 12.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x8x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,
      2., 0., 0., 0., 0., 0., 0., 0., 0., 0., 3., 0., 4., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 5., 0., 6., 0., 0., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x8x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      1., 2.,  0.,  0.,  3.,  4.,  5.,  6.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  7.,  8.,  0.,  0.,
      9., 10., 11., 12., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0.,  13., 14., 0.,  0.,  15., 16., 17., 18.,
      0., 0.,  0.,  0.,  19., 20., 0.,  0.,  21., 22., 23., 24.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x8x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,
      0.,  0.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2.,  0., 0.,
      3.,  4.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,
      0.,  0.,  0., 0., 5., 6., 0., 0., 7., 8., 0., 0., 0., 0.,  0., 0.,
      0.,  0.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9., 10., 0., 0.,
      11., 12., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x8x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,
      0.,  0.,  0.,  0.,  5.,  6.,  7.,  8.,  9.,  10., 11., 12., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  13.,
      14., 15., 16., 0.,  0.,  0.,  0.,  17., 18., 19., 20., 21., 22., 23., 24.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  25., 26., 27., 28., 0.,  0.,  0.,  0.,  29., 30., 31., 32., 33.,
      34., 35., 36., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  37., 38., 39., 40.,
      0.,  0.,  0.,  0.,  41., 42., 43., 44., 45., 46., 47., 48.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x8x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0.,
      5.,  6.,  7.,  8.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      13., 14., 15., 16., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 17., 18., 19., 20., 0., 0., 0., 0.,
      21., 22., 23., 24., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x8x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0., 0.,  0.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 1., 0., 2.,  0., 3.,  4.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 5., 0., 6.,  0., 7.,  8.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 9., 0., 10., 0., 11., 12., 0., 0., 13., 0., 14., 0., 15., 16.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x8x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 1., 0., 2., 0., 3., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 4., 0., 5., 0., 6., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 7., 0., 8., 0., 9., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x8x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0., 5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 9.,  10., 0., 0., 11., 12., 0., 0., 13., 14., 15., 16.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 17., 18., 0., 0., 19., 20., 0., 0., 21., 22., 23., 24.,
      0., 0., 0., 0., 25., 26., 0., 0., 27., 28., 0., 0., 29., 30., 31., 32.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x8x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0., 5.,  6.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 7.,  8.,  0., 0., 9.,  10., 0., 0., 11., 12., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 13., 14., 0., 0., 15., 16., 0., 0., 17., 18., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME1x8x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,
      4.,  0.,  0.,  0.,  0.,  5.,  6.,  7.,  8.,  0.,  0.,  0.,  0.,  9.,  10.,
      11., 12., 13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  17., 18., 19., 20., 0.,  0.,  0.,  0.,  21., 22., 23., 24., 0.,  0.,
      0.,  0.,  25., 26., 27., 28., 29., 30., 31., 32., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  33., 34., 35., 36., 0.,  0.,  0.,  0.,  37., 38.,
      39., 40., 0.,  0.,  0.,  0.,  41., 42., 43., 44., 45., 46., 47., 48., 0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  49., 50., 51., 52., 0.,  0.,  0.,  0.,
      53., 54., 55., 56., 0.,  0.,  0.,  0.,  57., 58., 59., 60., 61., 62., 63.,
      64.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID1x8x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0.,
      5.,  6.,  7.,  8.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 13., 14., 15., 16., 0., 0., 0., 0.,
      17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 25., 26., 27., 28., 0., 0., 0., 0.,
      29., 30., 31., 32., 0., 0., 0., 0., 33., 34., 35., 36., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x5x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0., 0.,  0.,  0., 1.,  0., 2.,  3.,  0., 0.,  0., 0.,  0.,
      0., 4.,  0., 5.,  6.,  0., 7.,  0., 8.,  9.,  0., 0.,  0., 0.,  0.,
      0., 10., 0., 11., 12., 0., 0.,  0., 0.,  0.,  0., 13., 0., 14., 15.,
      0., 16., 0., 17., 18., 0., 0.,  0., 0.,  0.,  0., 19., 0., 20., 21.,
      0., 0.,  0., 0.,  0.,  0., 22., 0., 23., 24., 0., 25., 0., 26., 27.};
  const std::array<int, 4> in_shape = {{3, 5, 5, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x5x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0., 0., 0., 0., 0., 0., 0., 1.,  0., 2.,
      0., 0., 0., 0., 0.,  0., 0., 3., 0., 4., 0., 0., 0.,  0., 0.,
      0., 0., 0., 0., 0.,  0., 0., 5., 0., 6., 0., 0., 0.,  0., 0.,
      0., 0., 7., 0., 8.,  0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,
      0., 0., 9., 0., 10., 0., 0., 0., 0., 0., 0., 0., 11., 0., 12.};
  const std::array<int, 4> in_shape = {{3, 5, 5, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x5x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0., 0.,  1.,  2.,  0.,
      0., 3.,  4.,  5.,  6.,  0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,
      0., 0.,  7.,  8.,  0.,  0., 9.,  10., 11., 12., 0., 0.,  13., 14., 0.,
      0., 15., 16., 17., 18., 0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,
      0., 0.,  19., 20., 0.,  0., 21., 22., 23., 24., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0., 0.,  25., 26., 0.,  0., 27., 28., 29., 30.,
      0., 0.,  31., 32., 0.,  0., 33., 34., 35., 36., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0., 0.,  37., 38., 0.,  0., 39., 40., 41., 42.,
      0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0., 0.,  43., 44., 0.,
      0., 45., 46., 47., 48., 0., 0.,  49., 50., 0.,  0., 51., 52., 53., 54.};
  const std::array<int, 4> in_shape = {{3, 5, 5, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x5x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  1.,  2.,  0., 0., 3.,  4.,
      0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  5.,
      6.,  0., 0., 7.,  8.,  0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  9.,
      10., 0., 0., 11., 12., 0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  13., 14., 0., 0., 15., 16., 0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  17., 18., 0., 0., 19., 20., 0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  0.,  0.,  0., 0., 0.,  21., 22., 0., 0., 23., 24.};
  const std::array<int, 4> in_shape = {{3, 5, 5, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x5x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   1.,   2.,
      3.,  4.,   0.,  0.,  0.,  0.,  5.,   6.,   7.,   8.,   9.,   10.,  11.,
      12., 0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,   13.,
      14., 15.,  16., 0.,  0.,  0.,  0.,   17.,  18.,  19.,  20.,  21.,  22.,
      23., 24.,  0.,  0.,  0.,  0.,  25.,  26.,  27.,  28.,  0.,   0.,   0.,
      0.,  29.,  30., 31., 32., 33., 34.,  35.,  36.,  0.,   0.,   0.,   0.,
      0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,  0.,  0.,  0.,  0.,   37.,  38.,  39.,  40.,  0.,   0.,
      0.,  0.,   41., 42., 43., 44., 45.,  46.,  47.,  48.,  0.,   0.,   0.,
      0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   49.,  50.,  51.,  52.,  0.,
      0.,  0.,   0.,  53., 54., 55., 56.,  57.,  58.,  59.,  60.,  0.,   0.,
      0.,  0.,   61., 62., 63., 64., 0.,   0.,   0.,   0.,   65.,  66.,  67.,
      68., 69.,  70., 71., 72., 0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,  73., 74., 75., 76.,  0.,   0.,   0.,   0.,   77.,  78.,
      79., 80.,  81., 82., 83., 84., 0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,  0.,  85., 86., 87.,  88.,  0.,   0.,   0.,   0.,   89.,
      90., 91.,  92., 93., 94., 95., 96.,  0.,   0.,   0.,   0.,   97.,  98.,
      99., 100., 0.,  0.,  0.,  0.,  101., 102., 103., 104., 105., 106., 107.,
      108.};
  const std::array<int, 4> in_shape = {{3, 5, 5, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x5x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  0.,  0.,  0.,  0.,
      5.,  6.,  7.,  8.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  9.,  10., 11., 12., 0.,  0.,  0.,  0.,  13., 14.,
      15., 16., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  17., 18., 19., 20., 0.,  0.,
      0.,  0.,  21., 22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  25., 26., 27., 28., 0.,  0.,  0.,  0.,
      29., 30., 31., 32., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  33., 34., 35., 36.,
      0.,  0.,  0.,  0.,  37., 38., 39., 40., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  41., 42., 43., 44., 0.,  0.,
      0.,  0.,  45., 46., 47., 48.};
  const std::array<int, 4> in_shape = {{3, 5, 5, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x5x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0.,  0., 0.,  1.,  0., 2.,  3.,  0., 0.,  0.,
      0., 0., 0., 0., 0., 4.,  0., 5.,  6.,  0., 0.,  7.,  0., 8.,  9.,
      0., 0., 0., 0., 0., 0.,  0., 0.,  10., 0., 11., 12., 0., 0.,  0.,
      0., 0., 0., 0., 0., 13., 0., 14., 15., 0., 0.,  16., 0., 17., 18.,
      0., 0., 0., 0., 0., 0.,  0., 0.,  19., 0., 20., 21., 0., 0.,  0.,
      0., 0., 0., 0., 0., 22., 0., 23., 24., 0., 0.,  25., 0., 26., 27.};
  const std::array<int, 4> in_shape = {{3, 5, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x5x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,  1.,
      0., 2.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 3.,  0., 4.,  0.,
      0., 0.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,  5.,
      0., 6.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 7.,  0., 8.,  0.,
      0., 0.,  0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,  9.,
      0., 10., 0., 0., 0., 0., 0., 0., 0., 0., 0., 11., 0., 12., 0.};
  const std::array<int, 4> in_shape = {{3, 5, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x5x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0.,
      0.,  1.,  2.,  0., 0., 3.,  4.,  5.,  6.,  0., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0., 7.,  8.,  0.,  0.,  9.,
      10., 11., 12., 0., 0., 0.,  0.,  13., 14., 0., 0.,  15., 16., 17., 18.,
      0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0.,
      0.,  19., 20., 0., 0., 21., 22., 23., 24., 0., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0., 25., 26., 0.,  0.,  27.,
      28., 29., 30., 0., 0., 0.,  0.,  31., 32., 0., 0.,  33., 34., 35., 36.,
      0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0.,
      0.,  37., 38., 0., 0., 39., 40., 41., 42., 0., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0., 43., 44., 0.,  0.,  45.,
      46., 47., 48., 0., 0., 0.,  0.,  49., 50., 0., 0.,  51., 52., 53., 54.};
  const std::array<int, 4> in_shape = {{3, 5, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x5x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  1.,  2.,
      0., 0., 3.,  4.,  0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 5.,  6.,  0., 0., 7.,  8.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  9.,  10.,
      0., 0., 11., 12., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 13., 14., 0., 0., 15., 16., 0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  17., 18.,
      0., 0., 19., 20., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 21., 22., 0., 0., 23., 24., 0.,  0.};
  const std::array<int, 4> in_shape = {{3, 5, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x5x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   1.,   2.,   3.,  4.,   0.,  0.,  0.,
      0.,  5.,   6.,   7.,   8.,   9.,   10.,  11.,  12., 0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   13.,  14.,  15.,  16.,  0.,   0.,   0.,  0.,   17., 18., 19.,
      20., 21.,  22.,  23.,  24.,  0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      25., 26.,  27.,  28.,  0.,   0.,   0.,   0.,   29., 30.,  31., 32., 33.,
      34., 35.,  36.,  0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  37.,  38., 39., 40.,
      0.,  0.,   0.,   0.,   41.,  42.,  43.,  44.,  45., 46.,  47., 48., 0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   49.,  50.,  51.,  52., 0.,   0.,  0.,  0.,
      53., 54.,  55.,  56.,  57.,  58.,  59.,  60.,  0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   61.,  62.,  63.,  64.,  0.,   0.,  0.,   0.,  65., 66.,
      67., 68.,  69.,  70.,  71.,  72.,  0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  73.,
      74., 75.,  76.,  0.,   0.,   0.,   0.,   77.,  78., 79.,  80., 81., 82.,
      83., 84.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   85., 86.,  87., 88., 0.,
      0.,  0.,   0.,   89.,  90.,  91.,  92.,  93.,  94., 95.,  96., 0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   97.,  98.,  99., 100., 0.,  0.,  0.,
      0.,  101., 102., 103., 104., 105., 106., 107., 108.};
  const std::array<int, 4> in_shape = {{3, 5, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x5x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0.,
      5.,  6.,  7.,  8.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      13., 14., 15., 16., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      25., 26., 27., 28., 0., 0., 0., 0., 29., 30., 31., 32., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 33., 34., 35., 36., 0., 0., 0., 0.,
      37., 38., 39., 40., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 41., 42., 43., 44., 0., 0., 0., 0.,
      45., 46., 47., 48., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 5, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x5x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  2., 0.,  3.,
      4.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  5.,  0., 6.,  0.,
      7.,  8.,  0.,  0.,  9.,  0.,  10., 0.,  11., 12., 0.,  0.,  0., 0.,  0.,
      0.,  0.,  0.,  0.,  0.,  13., 0.,  14., 0.,  15., 16., 0.,  0., 0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  17., 0.,  18., 0.,  19., 20., 0., 0.,  21.,
      0.,  22., 0.,  23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0.,  0.,
      25., 0.,  26., 0.,  27., 28., 0.,  0.,  0.,  0.,  0.,  0.,  0., 0.,  0.,
      0.,  29., 0.,  30., 0.,  31., 32., 0.,  0.,  33., 0.,  34., 0., 35., 36.};
  const std::array<int, 4> in_shape = {{3, 5, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x5x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0., 0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0.,  0., 1.,  0., 2., 0., 3., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0.,  0., 0.,  4., 0., 5., 0., 6.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0.,  0., 0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  7.,  0.,
      8., 0.,  9., 0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  10.,
      0., 11., 0., 12., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0.,  0., 0.,  0., 0., 0., 0., 13., 0.,  14., 0.,  15., 0.,  0.,
      0., 0.,  0., 0.,  0., 0., 0., 0., 0.,  16., 0.,  17., 0.,  18., 0.};
  const std::array<int, 4> in_shape = {{3, 5, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x5x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0., 5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 9.,  10., 0., 0., 11., 12., 0., 0., 13., 14., 15., 16.,
      0., 0., 0., 0., 17., 18., 0., 0., 19., 20., 0., 0., 21., 22., 23., 24.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 25., 26., 0., 0., 27., 28., 0., 0., 29., 30., 31., 32.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 33., 34., 0., 0., 35., 36., 0., 0., 37., 38., 39., 40.,
      0., 0., 0., 0., 41., 42., 0., 0., 43., 44., 0., 0., 45., 46., 47., 48.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 49., 50., 0., 0., 51., 52., 0., 0., 53., 54., 55., 56.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 57., 58., 0., 0., 59., 60., 0., 0., 61., 62., 63., 64.,
      0., 0., 0., 0., 65., 66., 0., 0., 67., 68., 0., 0., 69., 70., 71., 72.};
  const std::array<int, 4> in_shape = {{3, 5, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x5x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0., 5.,  6.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 7.,  8.,  0., 0., 9.,  10., 0., 0., 11., 12., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 13., 14., 0., 0., 15., 16., 0., 0., 17., 18., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 19., 20., 0., 0., 21., 22., 0., 0., 23., 24., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 25., 26., 0., 0., 27., 28., 0., 0., 29., 30., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 31., 32., 0., 0., 33., 34., 0., 0., 35., 36., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 5, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x5x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   1.,   2.,   3.,   4.,   0.,   0.,   0.,   0.,
      5.,   6.,   7.,   8.,   0.,   0.,   0.,   0.,   9.,   10.,  11.,  12.,
      13.,  14.,  15.,  16.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   17.,  18.,  19.,  20.,
      0.,   0.,   0.,   0.,   21.,  22.,  23.,  24.,  0.,   0.,   0.,   0.,
      25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   33.,  34.,  35.,  36.,  0.,   0.,   0.,   0.,
      37.,  38.,  39.,  40.,  0.,   0.,   0.,   0.,   41.,  42.,  43.,  44.,
      45.,  46.,  47.,  48.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   49.,  50.,  51.,  52.,
      0.,   0.,   0.,   0.,   53.,  54.,  55.,  56.,  0.,   0.,   0.,   0.,
      57.,  58.,  59.,  60.,  61.,  62.,  63.,  64.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      65.,  66.,  67.,  68.,  0.,   0.,   0.,   0.,   69.,  70.,  71.,  72.,
      0.,   0.,   0.,   0.,   73.,  74.,  75.,  76.,  77.,  78.,  79.,  80.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   81.,  82.,  83.,  84.,
      0.,   0.,   0.,   0.,   85.,  86.,  87.,  88.,  0.,   0.,   0.,   0.,
      89.,  90.,  91.,  92.,  93.,  94.,  95.,  96.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      97.,  98.,  99.,  100., 0.,   0.,   0.,   0.,   101., 102., 103., 104.,
      0.,   0.,   0.,   0.,   105., 106., 107., 108., 109., 110., 111., 112.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   113., 114., 115., 116., 0.,   0.,   0.,   0.,
      117., 118., 119., 120., 0.,   0.,   0.,   0.,   121., 122., 123., 124.,
      125., 126., 127., 128., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      129., 130., 131., 132., 0.,   0.,   0.,   0.,   133., 134., 135., 136.,
      0.,   0.,   0.,   0.,   137., 138., 139., 140., 141., 142., 143., 144.};
  const std::array<int, 4> in_shape = {{3, 5, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x5x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0.,
      5.,  6.,  7.,  8.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 13., 14., 15., 16., 0., 0., 0., 0.,
      17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 25., 26., 27., 28., 0., 0., 0., 0.,
      29., 30., 31., 32., 0., 0., 0., 0., 33., 34., 35., 36., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 37., 38., 39., 40., 0., 0., 0., 0.,
      41., 42., 43., 44., 0., 0., 0., 0., 45., 46., 47., 48., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 49., 50., 51., 52., 0., 0., 0., 0.,
      53., 54., 55., 56., 0., 0., 0., 0., 57., 58., 59., 60., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 61., 62., 63., 64., 0., 0., 0., 0.,
      65., 66., 67., 68., 0., 0., 0., 0., 69., 70., 71., 72., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 5, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x6x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0.,  0., 0.,  0.,  0., 1.,  0., 2.,  3.,
      0., 0., 0., 0., 0., 0., 4.,  0., 5.,  6.,  0., 7.,  0., 8.,  9.,
      0., 0., 0., 0., 0., 0., 0.,  0., 0.,  0.,  0., 10., 0., 11., 12.,
      0., 0., 0., 0., 0., 0., 13., 0., 14., 15., 0., 16., 0., 17., 18.,
      0., 0., 0., 0., 0., 0., 0.,  0., 0.,  0.,  0., 19., 0., 20., 21.,
      0., 0., 0., 0., 0., 0., 22., 0., 23., 24., 0., 25., 0., 26., 27.};
  const std::array<int, 4> in_shape = {{3, 6, 5, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x6x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,  0., 0., 1., 0., 2.,
      0., 0., 0., 0., 0., 0., 0., 3.,  0., 4.,  0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,  0., 0., 5., 0., 6.,
      0., 0., 0., 0., 0., 0., 0., 7.,  0., 8.,  0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0.,  0., 0.,  0., 0., 9., 0., 10.,
      0., 0., 0., 0., 0., 0., 0., 11., 0., 12., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 6, 5, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x6x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0., 0., 1.,  2.,  0., 0., 3.,  4.,  5.,  6.,
      0., 0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  7.,  8.,  0.,
      0., 9.,  10., 11., 12., 0., 0., 13., 14., 0., 0., 15., 16., 17., 18.,
      0., 0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0., 0., 19., 20., 0., 0., 21., 22., 23., 24.,
      0., 0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  25., 26., 0.,
      0., 27., 28., 29., 30., 0., 0., 31., 32., 0., 0., 33., 34., 35., 36.,
      0., 0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0., 0., 37., 38., 0., 0., 39., 40., 41., 42.,
      0., 0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  43., 44., 0.,
      0., 45., 46., 47., 48., 0., 0., 49., 50., 0., 0., 51., 52., 53., 54.};
  const std::array<int, 4> in_shape = {{3, 6, 5, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x6x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,
      0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  5.,
      6.,  0., 0., 7.,  8.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 9.,  10., 0., 0., 11., 12.,
      0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  13.,
      14., 0., 0., 15., 16., 0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,
      0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 17., 18., 0., 0., 19., 20.,
      0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  21.,
      22., 0., 0., 23., 24., 0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.};
  const std::array<int, 4> in_shape = {{3, 6, 5, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x6x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   1.,   2.,   3.,   4.,  0.,   0.,  0.,  0.,
      5.,  6.,   7.,   8.,   9.,   10.,  11.,  12.,  0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   13.,  14.,  15., 16.,  0.,  0.,  0.,
      0.,  17.,  18.,  19.,  20.,  21.,  22.,  23.,  24., 0.,   0.,  0.,  0.,
      25., 26.,  27.,  28.,  0.,   0.,   0.,   0.,   29., 30.,  31., 32., 33.,
      34., 35.,  36.,  0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   37., 38.,  39., 40., 0.,
      0.,  0.,   0.,   41.,  42.,  43.,  44.,  45.,  46., 47.,  48., 0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  49.,  50., 51., 52.,
      0.,  0.,   0.,   0.,   53.,  54.,  55.,  56.,  57., 58.,  59., 60., 0.,
      0.,  0.,   0.,   61.,  62.,  63.,  64.,  0.,   0.,  0.,   0.,  65., 66.,
      67., 68.,  69.,  70.,  71.,  72.,  0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  73., 74.,
      75., 76.,  0.,   0.,   0.,   0.,   77.,  78.,  79., 80.,  81., 82., 83.,
      84., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,  0.,  85.,
      86., 87.,  88.,  0.,   0.,   0.,   0.,   89.,  90., 91.,  92., 93., 94.,
      95., 96.,  0.,   0.,   0.,   0.,   97.,  98.,  99., 100., 0.,  0.,  0.,
      0.,  101., 102., 103., 104., 105., 106., 107., 108.};
  const std::array<int, 4> in_shape = {{3, 6, 5, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x6x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      1.,  2.,  3.,  4.,  0., 0., 0., 0., 5.,  6.,  7.,  8.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      13., 14., 15., 16., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 17., 18., 19., 20., 0., 0., 0., 0.,
      21., 22., 23., 24., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      25., 26., 27., 28., 0., 0., 0., 0., 29., 30., 31., 32., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      33., 34., 35., 36., 0., 0., 0., 0., 37., 38., 39., 40., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 41., 42., 43., 44., 0., 0., 0., 0.,
      45., 46., 47., 48., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 6, 5, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x6x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0., 1.,  0.,
      2.,  3.,  0.,  0., 0.,  0.,  0.,  0.,  0.,  0.,  4.,  0., 5., 6., 0.,  0.,
      7.,  0.,  8.,  9., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0., 0.,  0.,
      0.,  0.,  10., 0., 11., 12., 0.,  0.,  0.,  0.,  0.,  0., 0., 0., 13., 0.,
      14., 15., 0.,  0., 16., 0.,  17., 18., 0.,  0.,  0.,  0., 0., 0., 0.,  0.,
      0.,  0.,  0.,  0., 0.,  0.,  19., 0.,  20., 21., 0.,  0., 0., 0., 0.,  0.,
      0.,  0.,  22., 0., 23., 24., 0.,  0.,  25., 0.,  26., 27.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x6x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0., 0.,  0., 0., 0., 0.,  0., 0., 0., 0., 0., 1., 0.,
      2., 0., 0.,  0., 0.,  0., 0., 0., 0.,  0., 3., 0., 4., 0., 0., 0.,
      0., 0., 0.,  0., 0.,  0., 0., 0., 0.,  0., 0., 0., 0., 0., 0., 0.,
      0., 0., 5.,  0., 6.,  0., 0., 0., 0.,  0., 0., 0., 0., 0., 7., 0.,
      8., 0., 0.,  0., 0.,  0., 0., 0., 0.,  0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0.,  0., 0.,  0., 9., 0., 10., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 11., 0., 12., 0., 0., 0., 0.,  0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x6x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,
      0.,  0.,  3.,  4.,  5.,  6.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  7.,  8.,  0.,  0.,  9.,  10., 11., 12.,
      0.,  0.,  0.,  0.,  13., 14., 0.,  0.,  15., 16., 17., 18., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  19., 20., 0.,  0.,  21.,
      22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  25., 26., 0.,  0.,  27., 28., 29., 30., 0.,  0.,  0.,
      0.,  31., 32., 0.,  0.,  33., 34., 35., 36., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  37., 38., 0.,  0.,  39., 40., 41., 42.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  43., 44., 0.,  0.,  45., 46., 47., 48., 0.,  0.,  0.,  0.,  49., 50.,
      0.,  0.,  51., 52., 53., 54.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x6x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 1.,  2.,  0., 0.,
      3.,  4.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 5.,  6.,  0., 0., 7.,  8.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 9.,  10., 0., 0., 11., 12., 0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 13., 14., 0., 0.,
      15., 16., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 17., 18., 0., 0.,
      19., 20., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 21., 22., 0., 0., 23., 24., 0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x6x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   1.,  2.,  3.,  4.,  0.,   0.,   0.,   0.,   5.,
      6.,   7.,   8.,  9.,   10., 11., 12., 0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      13.,  14.,  15., 16.,  0.,  0.,  0.,  0.,  17.,  18.,  19.,  20.,  21.,
      22.,  23.,  24., 0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   25.,  26.,
      27.,  28.,  0.,  0.,   0.,  0.,  29., 30., 31.,  32.,  33.,  34.,  35.,
      36.,  0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  37., 38., 39., 40.,  0.,   0.,   0.,   0.,
      41.,  42.,  43., 44.,  45., 46., 47., 48., 0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   49.,  50., 51.,  52., 0.,  0.,  0.,  0.,   53.,  54.,  55.,  56.,
      57.,  58.,  59., 60.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   61.,
      62.,  63.,  64., 0.,   0.,  0.,  0.,  65., 66.,  67.,  68.,  69.,  70.,
      71.,  72.,  0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  73., 74., 75.,  76.,  0.,   0.,   0.,
      0.,   77.,  78., 79.,  80., 81., 82., 83., 84.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,   85., 86.,  87., 88., 0.,  0.,  0.,   0.,   89.,  90.,  91.,
      92.,  93.,  94., 95.,  96., 0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      97.,  98.,  99., 100., 0.,  0.,  0.,  0.,  101., 102., 103., 104., 105.,
      106., 107., 108.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x6x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0.,
      5.,  6.,  7.,  8.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      13., 14., 15., 16., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 17., 18., 19., 20., 0., 0., 0., 0.,
      21., 22., 23., 24., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 25., 26., 27., 28., 0., 0., 0., 0.,
      29., 30., 31., 32., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 33., 34., 35., 36., 0., 0., 0., 0.,
      37., 38., 39., 40., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 41., 42., 43., 44., 0., 0., 0., 0.,
      45., 46., 47., 48., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x6x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0., 0.,  0., 0.,  0.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 1.,  0., 2.,  0., 3.,  4.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 5.,  0., 6.,  0., 7.,  8.,  0., 0., 9.,  0., 10., 0., 11., 12.,
      0., 0., 0.,  0., 0.,  0., 0.,  0.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 13., 0., 14., 0., 15., 16., 0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 17., 0., 18., 0., 19., 20., 0., 0., 21., 0., 22., 0., 23., 24.,
      0., 0., 0.,  0., 0.,  0., 0.,  0.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 25., 0., 26., 0., 27., 28., 0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 29., 0., 30., 0., 31., 32., 0., 0., 33., 0., 34., 0., 35., 36.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x6x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0., 0.,  0., 0.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 1.,  0., 2.,  0., 3.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 4.,  0., 5.,  0., 6.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0.,  0., 0.,  0., 0.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 7.,  0., 8.,  0., 9.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 10., 0., 11., 0., 12., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0.,  0., 0.,  0., 0.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 13., 0., 14., 0., 15., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 16., 0., 17., 0., 18., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x6x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0., 5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 9.,  10., 0., 0., 11., 12., 0., 0., 13., 14., 15., 16.,
      0., 0., 0., 0., 17., 18., 0., 0., 19., 20., 0., 0., 21., 22., 23., 24.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 25., 26., 0., 0., 27., 28., 0., 0., 29., 30., 31., 32.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 33., 34., 0., 0., 35., 36., 0., 0., 37., 38., 39., 40.,
      0., 0., 0., 0., 41., 42., 0., 0., 43., 44., 0., 0., 45., 46., 47., 48.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 49., 50., 0., 0., 51., 52., 0., 0., 53., 54., 55., 56.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 57., 58., 0., 0., 59., 60., 0., 0., 61., 62., 63., 64.,
      0., 0., 0., 0., 65., 66., 0., 0., 67., 68., 0., 0., 69., 70., 71., 72.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x6x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0., 5.,  6.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 7.,  8.,  0., 0., 9.,  10., 0., 0., 11., 12., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 13., 14., 0., 0., 15., 16., 0., 0., 17., 18., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 19., 20., 0., 0., 21., 22., 0., 0., 23., 24., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 25., 26., 0., 0., 27., 28., 0., 0., 29., 30., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 31., 32., 0., 0., 33., 34., 0., 0., 35., 36., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x6x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      1.,   2.,   3.,   4.,   0.,   0.,   0.,   0.,   5.,   6.,   7.,   8.,
      0.,   0.,   0.,   0.,   9.,   10.,  11.,  12.,  13.,  14.,  15.,  16.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   17.,  18.,  19.,  20.,  0.,   0.,   0.,   0.,
      21.,  22.,  23.,  24.,  0.,   0.,   0.,   0.,   25.,  26.,  27.,  28.,
      29.,  30.,  31.,  32.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      33.,  34.,  35.,  36.,  0.,   0.,   0.,   0.,   37.,  38.,  39.,  40.,
      0.,   0.,   0.,   0.,   41.,  42.,  43.,  44.,  45.,  46.,  47.,  48.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      49.,  50.,  51.,  52.,  0.,   0.,   0.,   0.,   53.,  54.,  55.,  56.,
      0.,   0.,   0.,   0.,   57.,  58.,  59.,  60.,  61.,  62.,  63.,  64.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   65.,  66.,  67.,  68.,  0.,   0.,   0.,   0.,
      69.,  70.,  71.,  72.,  0.,   0.,   0.,   0.,   73.,  74.,  75.,  76.,
      77.,  78.,  79.,  80.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      81.,  82.,  83.,  84.,  0.,   0.,   0.,   0.,   85.,  86.,  87.,  88.,
      0.,   0.,   0.,   0.,   89.,  90.,  91.,  92.,  93.,  94.,  95.,  96.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      97.,  98.,  99.,  100., 0.,   0.,   0.,   0.,   101., 102., 103., 104.,
      0.,   0.,   0.,   0.,   105., 106., 107., 108., 109., 110., 111., 112.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   113., 114., 115., 116., 0.,   0.,   0.,   0.,
      117., 118., 119., 120., 0.,   0.,   0.,   0.,   121., 122., 123., 124.,
      125., 126., 127., 128., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      129., 130., 131., 132., 0.,   0.,   0.,   0.,   133., 134., 135., 136.,
      0.,   0.,   0.,   0.,   137., 138., 139., 140., 141., 142., 143., 144.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x6x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0.,
      5.,  6.,  7.,  8.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 13., 14., 15., 16., 0., 0., 0., 0.,
      17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 25., 26., 27., 28., 0., 0., 0., 0.,
      29., 30., 31., 32., 0., 0., 0., 0., 33., 34., 35., 36., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 37., 38., 39., 40., 0., 0., 0., 0.,
      41., 42., 43., 44., 0., 0., 0., 0., 45., 46., 47., 48., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 49., 50., 51., 52., 0., 0., 0., 0.,
      53., 54., 55., 56., 0., 0., 0., 0., 57., 58., 59., 60., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 61., 62., 63., 64., 0., 0., 0., 0.,
      65., 66., 67., 68., 0., 0., 0., 0., 69., 70., 71., 72., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x8x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0., 0.,  0.,  0., 0.,  0., 0.,  0.,  0., 1.,  0., 2.,  3.,
      0., 0.,  0., 0.,  0.,  0., 4.,  0., 5.,  6.,  0., 0.,  0., 0.,  0.,
      0., 7.,  0., 8.,  9.,  0., 10., 0., 11., 12., 0., 0.,  0., 0.,  0.,
      0., 0.,  0., 0.,  0.,  0., 13., 0., 14., 15., 0., 0.,  0., 0.,  0.,
      0., 16., 0., 17., 18., 0., 0.,  0., 0.,  0.,  0., 19., 0., 20., 21.,
      0., 22., 0., 23., 24., 0., 0.,  0., 0.,  0.,  0., 0.,  0., 0.,  0.,
      0., 25., 0., 26., 27., 0., 0.,  0., 0.,  0.,  0., 28., 0., 29., 30.,
      0., 0.,  0., 0.,  0.,  0., 31., 0., 32., 33., 0., 34., 0., 35., 36.};
  const std::array<int, 4> in_shape = {{3, 8, 5, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x8x5x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0., 0.,  0., 0., 0.,  0., 0.,  0., 0., 1.,  0., 2.,
      0., 0., 0.,  0., 0.,  0., 0., 3.,  0., 4.,  0., 0., 0.,  0., 0.,
      0., 0., 5.,  0., 6.,  0., 0., 0.,  0., 0.,  0., 0., 0.,  0., 0.,
      0., 0., 0.,  0., 0.,  0., 0., 7.,  0., 8.,  0., 0., 0.,  0., 0.,
      0., 0., 9.,  0., 10., 0., 0., 0.,  0., 0.,  0., 0., 11., 0., 12.,
      0., 0., 0.,  0., 0.,  0., 0., 0.,  0., 0.,  0., 0., 0.,  0., 0.,
      0., 0., 13., 0., 14., 0., 0., 0.,  0., 0.,  0., 0., 15., 0., 16.,
      0., 0., 0.,  0., 0.,  0., 0., 17., 0., 18., 0., 0., 0.,  0., 0.};
  const std::array<int, 4> in_shape = {{3, 8, 5, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x8x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0., 0.,  1.,  2.,  0.,  0., 3.,  4.,  5.,  6.,
      0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0., 0.,  7.,  8.,  0.,
      0., 9.,  10., 11., 12., 0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,
      0., 0.,  13., 14., 0.,  0., 15., 16., 17., 18., 0., 0.,  19., 20., 0.,
      0., 21., 22., 23., 24., 0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0., 0.,  25., 26., 0.,
      0., 27., 28., 29., 30., 0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,
      0., 0.,  31., 32., 0.,  0., 33., 34., 35., 36., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0., 0.,  37., 38., 0.,  0., 39., 40., 41., 42.,
      0., 0.,  43., 44., 0.,  0., 45., 46., 47., 48., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,
      0., 0.,  49., 50., 0.,  0., 51., 52., 53., 54., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0.,  0., 0.,  55., 56., 0.,  0., 57., 58., 59., 60.,
      0., 0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0., 0.,  61., 62., 0.,
      0., 63., 64., 65., 66., 0., 0.,  67., 68., 0.,  0., 69., 70., 71., 72.};
  const std::array<int, 4> in_shape = {{3, 8, 5, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x8x5x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 5.,  6.,  0., 0.,
      7.,  8.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      9.,  10., 0., 0., 11., 12., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 13., 14., 0., 0., 15., 16., 0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 17., 18., 0., 0.,
      19., 20., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      21., 22., 0., 0., 23., 24., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 25., 26., 0., 0., 27., 28., 0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 29., 30., 0., 0.,
      31., 32., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      33., 34., 0., 0., 35., 36., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.};
  const std::array<int, 4> in_shape = {{3, 8, 5, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x8x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   1.,   2.,   3.,   4.,
      0.,   0.,   0.,   0.,   5.,   6.,   7.,   8.,   9.,   10.,  11.,  12.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      13.,  14.,  15.,  16.,  0.,   0.,   0.,   0.,   17.,  18.,  19.,  20.,
      21.,  22.,  23.,  24.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   25.,  26.,  27.,  28.,  0.,   0.,   0.,   0.,
      29.,  30.,  31.,  32.,  33.,  34.,  35.,  36.,  0.,   0.,   0.,   0.,
      37.,  38.,  39.,  40.,  0.,   0.,   0.,   0.,   41.,  42.,  43.,  44.,
      45.,  46.,  47.,  48.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      49.,  50.,  51.,  52.,  0.,   0.,   0.,   0.,   53.,  54.,  55.,  56.,
      57.,  58.,  59.,  60.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   61.,  62.,  63.,  64.,  0.,   0.,   0.,   0.,
      65.,  66.,  67.,  68.,  69.,  70.,  71.,  72.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   73.,  74.,  75.,  76.,
      0.,   0.,   0.,   0.,   77.,  78.,  79.,  80.,  81.,  82.,  83.,  84.,
      0.,   0.,   0.,   0.,   85.,  86.,  87.,  88.,  0.,   0.,   0.,   0.,
      89.,  90.,  91.,  92.,  93.,  94.,  95.,  96.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   97.,  98.,  99.,  100., 0.,   0.,   0.,   0.,
      101., 102., 103., 104., 105., 106., 107., 108., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   109., 110., 111., 112.,
      0.,   0.,   0.,   0.,   113., 114., 115., 116., 117., 118., 119., 120.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      121., 122., 123., 124., 0.,   0.,   0.,   0.,   125., 126., 127., 128.,
      129., 130., 131., 132., 0.,   0.,   0.,   0.,   133., 134., 135., 136.,
      0.,   0.,   0.,   0.,   137., 138., 139., 140., 141., 142., 143., 144.};
  const std::array<int, 4> in_shape = {{3, 8, 5, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x8x5x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      1.,  2.,  3.,  4.,  0., 0., 0., 0., 5.,  6.,  7.,  8.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      13., 14., 15., 16., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      25., 26., 27., 28., 0., 0., 0., 0., 29., 30., 31., 32., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 33., 34., 35., 36., 0., 0., 0., 0.,
      37., 38., 39., 40., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      41., 42., 43., 44., 0., 0., 0., 0., 45., 46., 47., 48., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      49., 50., 51., 52., 0., 0., 0., 0., 53., 54., 55., 56., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 57., 58., 59., 60., 0., 0., 0., 0.,
      61., 62., 63., 64., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      65., 66., 67., 68., 0., 0., 0., 0., 69., 70., 71., 72., 0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 8, 5, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x8x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0., 0., 0., 0., 0.,  0., 0.,  0.,  0.,  0., 0.,  0.,  1.,  0.,
      2.,  3.,  0., 0., 0., 0., 0.,  0., 0.,  0.,  4.,  0., 5.,  6.,  0.,  0.,
      0.,  0.,  0., 0., 0., 0., 7.,  0., 8.,  9.,  0.,  0., 10., 0.,  11., 12.,
      0.,  0.,  0., 0., 0., 0., 0.,  0., 0.,  0.,  0.,  0., 0.,  0.,  13., 0.,
      14., 15., 0., 0., 0., 0., 0.,  0., 0.,  0.,  16., 0., 17., 18., 0.,  0.,
      0.,  0.,  0., 0., 0., 0., 19., 0., 20., 21., 0.,  0., 22., 0.,  23., 24.,
      0.,  0.,  0., 0., 0., 0., 0.,  0., 0.,  0.,  0.,  0., 0.,  0.,  25., 0.,
      26., 27., 0., 0., 0., 0., 0.,  0., 0.,  0.,  28., 0., 29., 30., 0.,  0.,
      0.,  0.,  0., 0., 0., 0., 31., 0., 32., 33., 0.,  0., 34., 0.,  35., 36.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x8x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0., 0., 0., 0., 0., 0.,  0., 0.,  0., 0.,  0., 0.,  0., 1.,  0.,
      2.,  0., 0., 0., 0., 0., 0.,  0., 0.,  0., 3.,  0., 4.,  0., 0.,  0.,
      0.,  0., 0., 0., 0., 0., 5.,  0., 6.,  0., 0.,  0., 0.,  0., 0.,  0.,
      0.,  0., 0., 0., 0., 0., 0.,  0., 0.,  0., 0.,  0., 0.,  0., 7.,  0.,
      8.,  0., 0., 0., 0., 0., 0.,  0., 0.,  0., 9.,  0., 10., 0., 0.,  0.,
      0.,  0., 0., 0., 0., 0., 11., 0., 12., 0., 0.,  0., 0.,  0., 0.,  0.,
      0.,  0., 0., 0., 0., 0., 0.,  0., 0.,  0., 0.,  0., 0.,  0., 13., 0.,
      14., 0., 0., 0., 0., 0., 0.,  0., 0.,  0., 15., 0., 16., 0., 0.,  0.,
      0.,  0., 0., 0., 0., 0., 17., 0., 18., 0., 0.,  0., 0.,  0., 0.,  0.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x8x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,
      0.,  0.,  3.,  4.,  5.,  6.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  7.,  8.,  0.,  0.,  9.,  10., 11., 12.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  13., 14., 0.,  0.,  15., 16., 17., 18., 0.,  0.,  0.,  0.,  19., 20.,
      0.,  0.,  21., 22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  25., 26., 0.,  0.,  27., 28., 29., 30., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  31., 32.,
      0.,  0.,  33., 34., 35., 36., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  37., 38., 0.,  0.,  39., 40., 41., 42.,
      0.,  0.,  0.,  0.,  43., 44., 0.,  0.,  45., 46., 47., 48., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  49., 50., 0.,  0.,  51.,
      52., 53., 54., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  55., 56., 0.,  0.,  57., 58., 59., 60., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  61., 62.,
      0.,  0.,  63., 64., 65., 66., 0.,  0.,  0.,  0.,  67., 68., 0.,  0.,  69.,
      70., 71., 72.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x8x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 1.,  2.,  0., 0.,
      3.,  4.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 5.,  6.,  0., 0., 7.,  8.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 9.,  10., 0., 0.,
      11., 12., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 13., 14., 0., 0.,
      15., 16., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 17., 18., 0., 0., 19., 20., 0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 21., 22., 0., 0.,
      23., 24., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 25., 26., 0., 0.,
      27., 28., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 29., 30., 0., 0., 31., 32., 0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 33., 34., 0., 0.,
      35., 36., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x8x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   1.,   2.,   3.,   4.,
      0., 0., 0., 0., 5.,   6.,   7.,   8.,   9.,   10.,  11.,  12.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   13.,  14.,  15.,  16.,
      0., 0., 0., 0., 17.,  18.,  19.,  20.,  21.,  22.,  23.,  24.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   25.,  26.,  27.,  28.,
      0., 0., 0., 0., 29.,  30.,  31.,  32.,  33.,  34.,  35.,  36.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   37.,  38.,  39.,  40.,
      0., 0., 0., 0., 41.,  42.,  43.,  44.,  45.,  46.,  47.,  48.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   49.,  50.,  51.,  52.,
      0., 0., 0., 0., 53.,  54.,  55.,  56.,  57.,  58.,  59.,  60.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   61.,  62.,  63.,  64.,
      0., 0., 0., 0., 65.,  66.,  67.,  68.,  69.,  70.,  71.,  72.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   73.,  74.,  75.,  76.,
      0., 0., 0., 0., 77.,  78.,  79.,  80.,  81.,  82.,  83.,  84.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   85.,  86.,  87.,  88.,
      0., 0., 0., 0., 89.,  90.,  91.,  92.,  93.,  94.,  95.,  96.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   97.,  98.,  99.,  100.,
      0., 0., 0., 0., 101., 102., 103., 104., 105., 106., 107., 108.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   109., 110., 111., 112.,
      0., 0., 0., 0., 113., 114., 115., 116., 117., 118., 119., 120.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   121., 122., 123., 124.,
      0., 0., 0., 0., 125., 126., 127., 128., 129., 130., 131., 132.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   133., 134., 135., 136.,
      0., 0., 0., 0., 137., 138., 139., 140., 141., 142., 143., 144.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x8x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0.,
      5.,  6.,  7.,  8.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0.,
      13., 14., 15., 16., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 17., 18., 19., 20., 0., 0., 0., 0.,
      21., 22., 23., 24., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 25., 26., 27., 28., 0., 0., 0., 0.,
      29., 30., 31., 32., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 33., 34., 35., 36., 0., 0., 0., 0.,
      37., 38., 39., 40., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 41., 42., 43., 44., 0., 0., 0., 0.,
      45., 46., 47., 48., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 49., 50., 51., 52., 0., 0., 0., 0.,
      53., 54., 55., 56., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 57., 58., 59., 60., 0., 0., 0., 0.,
      61., 62., 63., 64., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 65., 66., 67., 68., 0., 0., 0., 0.,
      69., 70., 71., 72., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x8x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0., 0.,  0., 0.,  0.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 1.,  0., 2.,  0., 3.,  4.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 5.,  0., 6.,  0., 7.,  8.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 9.,  0., 10., 0., 11., 12., 0., 0., 13., 0., 14., 0., 15., 16.,
      0., 0., 0.,  0., 0.,  0., 0.,  0.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 17., 0., 18., 0., 19., 20., 0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 21., 0., 22., 0., 23., 24., 0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 25., 0., 26., 0., 27., 28., 0., 0., 29., 0., 30., 0., 31., 32.,
      0., 0., 0.,  0., 0.,  0., 0.,  0.,  0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 33., 0., 34., 0., 35., 36., 0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 37., 0., 38., 0., 39., 40., 0., 0., 0.,  0., 0.,  0., 0.,  0.,
      0., 0., 41., 0., 42., 0., 43., 44., 0., 0., 45., 0., 46., 0., 47., 48.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x8x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0., 0.,  0., 0.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 1.,  0., 2.,  0., 3.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 4.,  0., 5.,  0., 6.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 7.,  0., 8.,  0., 9.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0.,  0., 0.,  0., 0.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 10., 0., 11., 0., 12., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 13., 0., 14., 0., 15., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 16., 0., 17., 0., 18., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0.,  0., 0.,  0., 0.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 19., 0., 20., 0., 21., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 22., 0., 23., 0., 24., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 25., 0., 26., 0., 27., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x8x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0., 5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 9.,  10., 0., 0., 11., 12., 0., 0., 13., 14., 15., 16.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 17., 18., 0., 0., 19., 20., 0., 0., 21., 22., 23., 24.,
      0., 0., 0., 0., 25., 26., 0., 0., 27., 28., 0., 0., 29., 30., 31., 32.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 33., 34., 0., 0., 35., 36., 0., 0., 37., 38., 39., 40.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 41., 42., 0., 0., 43., 44., 0., 0., 45., 46., 47., 48.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 49., 50., 0., 0., 51., 52., 0., 0., 53., 54., 55., 56.,
      0., 0., 0., 0., 57., 58., 0., 0., 59., 60., 0., 0., 61., 62., 63., 64.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 65., 66., 0., 0., 67., 68., 0., 0., 69., 70., 71., 72.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 73., 74., 0., 0., 75., 76., 0., 0., 77., 78., 79., 80.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 81., 82., 0., 0., 83., 84., 0., 0., 85., 86., 87., 88.,
      0., 0., 0., 0., 89., 90., 0., 0., 91., 92., 0., 0., 93., 94., 95., 96.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x8x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 1.,  2.,  0., 0., 3.,  4.,  0., 0., 5.,  6.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 7.,  8.,  0., 0., 9.,  10., 0., 0., 11., 12., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 13., 14., 0., 0., 15., 16., 0., 0., 17., 18., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 19., 20., 0., 0., 21., 22., 0., 0., 23., 24., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 25., 26., 0., 0., 27., 28., 0., 0., 29., 30., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 31., 32., 0., 0., 33., 34., 0., 0., 35., 36., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 37., 38., 0., 0., 39., 40., 0., 0., 41., 42., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 43., 44., 0., 0., 45., 46., 0., 0., 47., 48., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 49., 50., 0., 0., 51., 52., 0., 0., 53., 54., 0., 0.,
      0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0., 0.,  0.,  0., 0.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, SAME3x8x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      1.,   2.,   3.,   4.,   0.,   0.,   0.,   0.,   5.,   6.,   7.,   8.,
      0.,   0.,   0.,   0.,   9.,   10.,  11.,  12.,  13.,  14.,  15.,  16.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   17.,  18.,  19.,  20.,  0.,   0.,   0.,   0.,
      21.,  22.,  23.,  24.,  0.,   0.,   0.,   0.,   25.,  26.,  27.,  28.,
      29.,  30.,  31.,  32.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   33.,  34.,  35.,  36.,
      0.,   0.,   0.,   0.,   37.,  38.,  39.,  40.,  0.,   0.,   0.,   0.,
      41.,  42.,  43.,  44.,  45.,  46.,  47.,  48.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   49.,  50.,  51.,  52.,  0.,   0.,   0.,   0.,
      53.,  54.,  55.,  56.,  0.,   0.,   0.,   0.,   57.,  58.,  59.,  60.,
      61.,  62.,  63.,  64.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   65.,  66.,  67.,  68.,  0.,   0.,   0.,   0.,
      69.,  70.,  71.,  72.,  0.,   0.,   0.,   0.,   73.,  74.,  75.,  76.,
      77.,  78.,  79.,  80.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   81.,  82.,  83.,  84.,
      0.,   0.,   0.,   0.,   85.,  86.,  87.,  88.,  0.,   0.,   0.,   0.,
      89.,  90.,  91.,  92.,  93.,  94.,  95.,  96.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      97.,  98.,  99.,  100., 0.,   0.,   0.,   0.,   101., 102., 103., 104.,
      0.,   0.,   0.,   0.,   105., 106., 107., 108., 109., 110., 111., 112.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   113., 114., 115., 116.,
      0.,   0.,   0.,   0.,   117., 118., 119., 120., 0.,   0.,   0.,   0.,
      121., 122., 123., 124., 125., 126., 127., 128., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   129., 130., 131., 132.,
      0.,   0.,   0.,   0.,   133., 134., 135., 136., 0.,   0.,   0.,   0.,
      137., 138., 139., 140., 141., 142., 143., 144., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      145., 146., 147., 148., 0.,   0.,   0.,   0.,   149., 150., 151., 152.,
      0.,   0.,   0.,   0.,   153., 154., 155., 156., 157., 158., 159., 160.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   161., 162., 163., 164., 0.,   0.,   0.,   0.,
      165., 166., 167., 168., 0.,   0.,   0.,   0.,   169., 170., 171., 172.,
      173., 174., 175., 176., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      177., 178., 179., 180., 0.,   0.,   0.,   0.,   181., 182., 183., 184.,
      0.,   0.,   0.,   0.,   185., 186., 187., 188., 189., 190., 191., 192.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxwithnanWindow3Stride2Grad, VALID3x8x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   1.,   2.,   3.,  4.,  0.,  0.,
      0.,   0.,   5.,   6.,   7.,  8.,   0.,   0.,   0.,   0.,  9.,  10., 11.,
      12.,  0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   13.,  14.,  15.,  16., 0.,  0.,  0.,
      0.,   17.,  18.,  19.,  20., 0.,   0.,   0.,   0.,   21., 22., 23., 24.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  25.,  26.,  27.,  28.,  0.,  0.,  0.,  0.,
      29.,  30.,  31.,  32.,  0.,  0.,   0.,   0.,   33.,  34., 35., 36., 0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   37.,  38., 39.,  40.,  0.,   0.,   0.,  0.,  41., 42.,
      43.,  44.,  0.,   0.,   0.,  0.,   45.,  46.,  47.,  48., 0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   49.,  50.,  51., 52.,  0.,   0.,   0.,   0.,  53., 54., 55.,
      56.,  0.,   0.,   0.,   0.,  57.,  58.,  59.,  60.,  0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   61.,  62.,  63.,  64., 0.,   0.,   0.,   0.,   65., 66., 67., 68.,
      0.,   0.,   0.,   0.,   69., 70.,  71.,  72.,  0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  73.,
      74.,  75.,  76.,  0.,   0.,  0.,   0.,   77.,  78.,  79., 80., 0.,  0.,
      0.,   0.,   81.,  82.,  83., 84.,  0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  85., 86.,
      87.,  88.,  0.,   0.,   0.,  0.,   89.,  90.,  91.,  92., 0.,  0.,  0.,
      0.,   93.,  94.,  95.,  96., 0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  97., 98., 99.,
      100., 0.,   0.,   0.,   0.,  101., 102., 103., 104., 0.,  0.,  0.,  0.,
      105., 106., 107., 108., 0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,
      0.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<3, 2>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
